poj1222 EXTENDED LIGHTS OUT

1
2
经典的异或方程组
bitset用printf输出时要强制转换类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include<iostream>
#include<cstdio>
#include<cstring>
#include<climits>
#include<queue>
#include<bitset>
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
inline LL read()
{
LL x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
return x*f;
}
int T;
int tmp;
bitset<38> a[38];
inline int getid(int x,int y){
return (x-1)*6+y;
}
inline void gauss()
{
register int i,j,k,now=1;
for(i=1;i<=30;++i){
if(a[now][i]==0){
for(j=now+1;j<=30&&a[j][i]==0;++j);
if(j>30) continue;
swap(a[now],a[j]);
}
for(k=1;k<=30;++k){
if(k!=now&&a[k][i]) a[k]^=a[now];
}
++now;
}
}
int main()
{
T=read();
for(int cas=1;cas<=T;++cas){
printf("PUZZLE #%d\n",cas);
for(int i=1;i<=30;++i){
a[i].reset();
}
for(int i=1;i<=5;++i){
for(int j=1;j<=6;++j){
tmp=getid(i,j);
a[tmp][31]=read();
a[tmp][tmp]=1;
if(i!=1){
a[tmp][tmp-6]=1;
}
if(i!=5){
a[tmp][tmp+6]=1;
}
if(j!=1){
a[tmp][tmp-1]=1;
}
if(j!=6){
a[tmp][tmp+1]=1;
}
}
}
gauss();
for(int i=1;i<=5;++i){
for(int j=1;j<=6;++j){
printf("%d ",int(a[getid(i,j)][31]));
}
puts("");
}
}
return 0;
}